{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 采用 sklearn 里的 Robust covariance 算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn import svm\n",
    "from sklearn.datasets import make_moons, make_blobs\n",
    "from sklearn.covariance import EllipticEnvelope"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 参数设定"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "matplotlib.rcParams['contour.negative_linestyle'] = 'solid'\n",
    "\n",
    "# Example settings\n",
    "n_samples = 300\n",
    "outliers_fraction = 0.15\n",
    "n_outliers = int(outliers_fraction * n_samples)\n",
    "n_inliers = n_samples - n_outliers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 建立算法模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "anomaly_algorithms = EllipticEnvelope(contamination=outliers_fraction)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 创建数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(300, 2)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "blobs_params = dict(random_state=0, n_samples=n_inliers, n_features=2)\n",
    "datasets =  make_blobs(centers=[[0, 0], [0, 0]], cluster_std=0.5,**blobs_params)[0]\n",
    "xx, yy = np.meshgrid(np.linspace(-7, 7, 150), np.linspace(-7, 7, 150))\n",
    "rng = np.random.RandomState(42)\n",
    "X = np.concatenate([datasets, rng.uniform(low=-6, high=6, size=(n_outliers, 2))], axis=0)\n",
    "X.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练并可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "anomaly_algorithms.fit(X)\n",
    "y_pred = anomaly_algorithms.predict(X)\n",
    "Z = anomaly_algorithms.predict(np.c_[xx.ravel(), yy.ravel()])\n",
    "Z = Z.reshape(xx.shape)\n",
    "plt.contour(xx, yy, Z, levels=[0], linewidths=2, colors='black')\n",
    "colors = np.array(['#377eb8', '#ff7f00'])\n",
    "plt.scatter(X[:, 0], X[:, 1], s=10, color=colors[(y_pred + 1) // 2])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 建立攻击数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(45, 2)"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a1 = rng.uniform(low=1.2, high=2.2, size=(n_outliers, 1))\n",
    "a2 = rng.uniform(low=-1.0, high=2.5, size=(n_outliers, 1))\n",
    "atk = np.concatenate([a1,a2], axis=1)\n",
    "atk.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 进行数据合并"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(345, 2)"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "atk_X = np.concatenate([X, atk], axis=0)\n",
    "atk_X.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 再训练并可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "anomaly_algorithms.fit(atk_X)\n",
    "y_pred = anomaly_algorithms.predict(atk_X)\n",
    "Z = anomaly_algorithms.predict(np.c_[xx.ravel(), yy.ravel()])\n",
    "Z = Z.reshape(xx.shape)\n",
    "plt.contour(xx, yy, Z, levels=[0], linewidths=2, colors='black')\n",
    "colors = np.array(['#377eb8', '#ff7f00'])\n",
    "plt.scatter(atk_X[:, 0], atk_X[:, 1], s=10, color=colors[(y_pred + 1) // 2])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
